function GeometryBuilder(){
	
	var _repGeometries = {};

	//<<CONSTANTES>>
	//estas constantes sacarlas del archivo de configuracion
	//var CONSTANTS.COLOR_SPACE = 0x88aaaa;
		
	//<<fin CONSTANTES>>
	
		
	//params.nuvevo (crea el material sin buscarlo en el repositorio)
	//params.<algo> : parametros dependientes del tipo de material
	this.getGeometry = function(tipo, params){
		if (!tipo) {alert("tipo de material invalido: "+tipo); return null;}
				
		var _nuevo = (params == undefined || params.nuevo == undefined)? false : params.nuevo;
		
		
		var RADIO_CENTROIDE = 16;
		
		
		var _generatedGeometry = null;
		
		//si la geometria ya esta creada y no se quiere uno 'nuevo', retornamos el del repositorio
//		if (_repGeometries[tipo] && !_nuevo) {
//			//console.log("reutilizando GEOMETRIA ->",tipo); 
//			return _repGeometries[tipo]
//			
//		};
		
		
		switch(tipo){
		
		case "arrow" : 	
			//_generatedGeometry = new THREE.MeshLambertMaterial( { color:  CONSTANTS.COLOR_PAREDES} );	
						if (params && params.geometryMaterial){
							if (_repGeometries[tipo+ params.geometryMaterial.id] && !_nuevo) {
								//console.log("reutilizando GEOMETRIA -> -> -> -> -> -> -> -> ->",tipo); 
								return _repGeometries[tipo+ params.geometryMaterial.id];
								
							};
							
						}else if (_repGeometries[tipo] && !_nuevo) {
							//console.log("reutilizando GEOMETRIA ->",tipo); 
							return _repGeometries[tipo];					
						};
			
			
						var ancho =  20;//40;
						var alto =  20;
						var triangleShape = new THREE.Shape();	
						triangleShape.moveTo( -ancho/2, 0 );
						triangleShape.lineTo(  ancho/2, 0 );
						triangleShape.lineTo( 0, alto );
						triangleShape.lineTo(  -ancho/2, 0 ); // close path
			
						var triangleGeo = triangleShape.extrude( {amount:0,  bevelEnabled: false} );
						if (params && params.geometryMaterial){
							//alert("ebtre");
						//	console.log("entre a arrow geometry", params.geometryMaterial );
							triangleGeo.materials.push(params.geometryMaterial);
							for ( var face in triangleGeo.faces ) {
								triangleGeo.faces[ face ].materialIndex = 0;
							}
							
						}
						
						_generatedGeometry = triangleGeo;
						
						
						if (params && params.geometryMaterial){							
							if (!_repGeometries[tipo+ params.geometryMaterial.id]) {_repGeometries[tipo+ params.geometryMaterial.id] = _generatedGeometry;}
							
						}else {							
							if (!_repGeometries[tipo]) {_repGeometries[tipo] = _generatedGeometry;}
						};
						
						return _generatedGeometry;
			break;	
		
//		case "escalon" :
//						_generatedGeometry = new THREE.MeshLambertMaterial( { color: CONSTANTS.COLOR_PAREDES} );		
//			break;
			
		case "centroide":
						_generatedGeometry = new THREE.SphereGeometry( RADIO_CENTROIDE, 10, 10, false );
			break;
			
			
		default : alert("tipo de geometria invalida: "+tipo); return null;
		
		
		}
		
		if (!_repGeometries[tipo]) {_repGeometries[tipo] = _generatedGeometry;}
		return _generatedGeometry;
		
		
	};
	
}